Java null检查为什么使用==代替.equals() 您所在的位置:网站首页 java nullequals Java null检查为什么使用==代替.equals()

Java null检查为什么使用==代替.equals()

#Java null检查为什么使用==代替.equals() | 来源: 网络整理| 查看: 265

在Java中,我被告知在执行null检查时应使用==而不是.equals()。 是什么原因呢?

相关讨论 最简单的方法是尝试使用equals()进行空检查并查看。 当您尝试时,它将立即显而易见 顺便说一句,一个带有关键字" java null check"(不带引号)的google搜索使我成为该线程的热门歌曲之一,它的信息与此处的答案相同。

他们是两个完全不同的东西。 ==比较变量包含的对象引用(如果有)。 .equals()根据两个对象的约定检查两个对象是否相等。根据它们的契约,两个不同的对象实例完全有可能"相等"。然后有一个次要细节,因为equals是一种方法,如果尝试在null引用上调用它,则会得到一个NullPointerException。

例如:

12345678910111213141516171819202122232425262728293031323334353637class Foo {     private int data;     Foo(int d) {         this.data = d;     }     @Override     public boolean equals(Object other) {         if (other == null || other.getClass() != this.getClass()) {            return false;         }         return ((Foo)other).data == this.data;     }     /* In a real class, you'd override `hashCode` here as well */ } Foo f1 = new Foo(5); Foo f2 = new Foo(5); System.out.println(f1 == f2); // outputs false, they're distinct object instances System.out.println(f1.equals(f2)); // outputs true, they're"equal" according to their definition Foo f3 = null; System.out.println(f3 == null); // outputs true, `f3` doesn't have any object reference assigned to it System.out.println(f3.equals(null)); // Throws a NullPointerException, you can't dereference `f3`, it doesn't refer to anything System.out.println(f1.equals(f3)); // Outputs false, since `f1` is a valid instance but `f3` is null, // so one of the first checks inside the `Foo#equals` method will // disallow the equality because it sees that `other` == null 相关讨论 您是说public int data吗? @Xepoch:不,我通常不创建公共字段(尽管无论哪种方式对于此示例来说都没有关系)。为什么?

如果在null上调用.equals(),则将得到NullPointerException

因此,始终建议在适用的地方调用方法之前检查无效性

123if(str!=null && str.equals("hi")){  //str contains hi }

另请参阅

Java中的equal-between-equals-和== 相关讨论 通常最好将您的示例写为if ("hi".equals(str))。 @ user368186:关键是equals方法是否包含空检查。如果您的对象引用为null,则调用someObject.equals(null)将引发NullPointerException,而无需输入equals方法。 @ColinD同意只是在这里演示 始终建议不惜一切代价避免空值,因此您根本不需要空值检查;)。 您可以始终使用Objects.equals(a, b),它不会引发NullPointerException,但仍取决于" a"和" b"的"等于"方法

除了接受的答案(https://stackoverflow.com/a/4501084/6276704):

从Java 1.7开始,如果要比较两个可能为null的对象,我建议使用此函数:

1Objects.equals(onePossibleNull, twoPossibleNull)

java.util.Objects

This class consists of static utility methods for operating on objects. These utilities include null-safe or null-tolerant methods for computing the hash code of an object, returning a string for an object, and comparing two objects.

Since: 1.7

在Java中,0或null是简单类型,而不是对象。

equals()方法不是为简单类型构建的。简单类型可以与==匹配。

相关讨论 支持最有用的实际答案,而不是明显的" NullPointerException将被返回" herp derp答案。

1foo.equals(null)

如果foo为null会怎样?

您得到一个NullPointerException。

如果我们使用=> .equals方法

123if(obj.equals(null))   // Which mean null.equals(null) when obj will be null.

当您的obj为null时,它将引发Null Point Exception。

所以我们应该使用==

1if(obj == null)

它将比较参考。

根据消息来源,默认方法实现使用什么都没有关系:

123public boolean equals(Object object) {     return this == object; }

但是您不能确定自定义类中的equals。

相关讨论 这很重要,因为equals只能返回false或导致NullPointerException(或者如果覆盖的equals方法是废话,则可能有所不同)。

如果尝试在空对象引用上调用equals,则将引发空指针异常。

如果Object变量为null,则无法对其调用equals()方法,因此,对对象引用null进行检查是正确的。

这是使用org.json时str != null但str.equals(null)的示例

12345 JSONObject jsonObj = new JSONObject("{field :null}");  Object field = jsonObj.get("field");  System.out.println(field != null);        // => true  System.out.println( field.equals(null)); //=> true  System.out.println( field.getClass());  // => org.json.JSONObject$Null

编辑: 这是org.json.JSONObject $ Null类:

1234567891011121314151617181920/**  * JSONObject.NULL is equivalent to the value that JavaScript calls null,  * whilst Java's null is equivalent to the value that JavaScript calls  * undefined.  */ private static final class Null {     /**      * A Null object is equal to the null value and to itself.      *      * @param object      *            An object to test for nullness.      * @return true if the object parameter is the JSONObject.NULL object or      *         null.      */     @Override     public boolean equals(Object object) {         return object == null || object == this;     }   } 相关讨论 这里的问题是field.equals(null)返回true。这破坏了常规的Java行为,因此令人困惑。至少在我看来,它仅对field.equals("null")有效。我不知道为什么图书馆开发人员会认为这会很好地支持。 顺便说一句,您的第一句话有语法问题,目前尚不清楚您的意思。您的意思是"这里是使用org.json时str != null和str.equals(null)返回true的示例"? 我认为那是因为jsonObject包含"字段"键,这就是field不为null的原因,它有一个包含json.org.JSONObject$Null对象的引用 是的,但是我不会像Null那样对待Null,而是会使用"null"。但是我想他们这样做是为了避免使用字符串。但是,即使有了该lib,field.equals(null)仍然几乎始终是一个问题:P。

因为equal是从Object类派生的函数,所以该函数比较该类的项。如果将它与null一起使用,它将返回false,原因是类的内容不为null。另外,==比较对对象的引用。

相关讨论 好吧,结果只能是false或NullPointerException(如果未将equals覆盖到不好的地方)。

我昨晚遇到过这种情况。 我认为这很简单:

Don't exist equals() method for null So, you can not invoke an inexistent method if you don't have -->>> That is reason for why we use == to check null

因此,我永远不会感到困惑,并且避免使用此解决方案出现问题:

123if(str.trim().length()


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有